#include <new>
#include "ShmBlock.h"
#include "IodpModule.h"
#include "ClientMgr.h"
#include "DataProc.h"

// 共享内存16M：16 * 1024 * 1024
#define SHARE_MEMORY_SIZE 16777216
#define IODP_MODULE_NAME "IodpModule"

static CIodpModule *g_sIodpModule = nullptr;
CShmBlock *CIodpModule::m_pShmPtr = nullptr;
CClientMgr *CIodpModule::m_pClntMgr = nullptr;

extern "C" CIodp *Create()
{
    if (nullptr == g_sIodpModule)
        g_sIodpModule = new CIodpModule();

    return g_sIodpModule;
}

CIodpModule::CIodpModule()
{
    m_pClntMgr = nullptr;
}

CIodpModule::~CIodpModule()
{
    Destroy();
}

bool CIodpModule::Init(void *pShm)
{
    CShmBlock *pShmPtr = (CShmBlock *)pShm;
    void *ptr = pShmPtr->Alloc(sizeof(CClientMgr));

    if (nullptr == ptr)
    {
        printf("Error: pShmPtr->Alloc\n");
        return false;
    }

    m_pClntMgr = new (ptr) CClientMgr();

    if (nullptr == m_pClntMgr)
        return false;

    m_pShmPtr = pShmPtr;

    return true;
}

void CIodpModule::Destroy()
{
    if (nullptr != m_pClntMgr)
    {
        // 共享内存块释放时一并释放
        // delete m_pClntMgr;
        m_pClntMgr = nullptr;
    }
}

char *CIodpModule::GetModuleName()
{
    return (char *)IODP_MODULE_NAME;
}

uint32_t CIodpModule::GetShmSize()
{
    return SHARE_MEMORY_SIZE;
}

// 为实现模块内的客户端间通讯
// 所有客户端信息放入共享内存，以便其他进程所属客户端共享访问
void *CIodpModule::NewClient(void *pSvr, CClient *pClnt)
{
    if (nullptr == m_pClntMgr || nullptr == pSvr || nullptr == pClnt)
        return nullptr;

    return m_pClntMgr->NewClient(pSvr, pClnt);
}

bool CIodpModule::DeleteClient(void *pNode)
{
    if (nullptr == m_pClntMgr || nullptr == pNode)
        return false;

    return m_pClntMgr->DeleteClient((ClntNode *)pNode);
}

// 能立即处理的数据，处理完毕，需发送的数据放入pPkgBuf发送
// 不能立即处理的数据，申请一个PkgBuf并拷贝数据给它，给到线程池处理，
// 处理完毕，通过WorkSvr的IpcSend发送给Client
bool CIodpModule::DataHandle(void *pHandle, const uint8_t *const pData, uint16_t nLen)
{
    ClntNode *pNode = (ClntNode *)pHandle;

    if (nullptr == pNode)
        return false;

    if (nullptr == pNode->pDataProc)
        return false;

    return pNode->pDataProc->DataHandle(pData, nLen);
}

// #include <string.h>
// bool CIodpModule::DataHandle(void *pHandle, const uint8_t *pData, uint16_t nLen)
// {
//     int iSent = -1;
//     ClntNode *pNode = (ClntNode *)pHandle;
//     uint8_t *pBuf = (uint8_t *)malloc(nLen);

//     if (nullptr == pBuf)
//         return false;

//     memcpy(pBuf, pData, nLen);
//     iSent = pNode->pClnt->SendData(pBuf, nLen);
//     free(pBuf);

//     return (-1 != iSent);
// }